package vigenere;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Vigenere {

	// Opération de codage et de décodage
	public static void operation(String op, String fileIn, String fileOut, String cle) {
		try {
			// Traitement de la clé
			int longueurCle = cle.length();
			
			// Création de l'alphabet
			String alphabet = "abcdefghijklmnopqrstuvwxyz";

			// Ouverture du fichier à lire
			System.out.println("Ouverture du fichier de lecture");
			FileReader fr = new FileReader(fileIn);
			BufferedReader br = new BufferedReader(fr);
			System.out.println("Fichier de lecture ouvert");

			// Ouverture du fichier qui contiendra le fichier encodé
			System.out.println("Ouverture du fichier d'écriture");
			FileWriter fw = new FileWriter(fileOut);
			System.out.println("Fichier d'écriture ouvert");
			
			// Initialisation de la boucle
			if (op.equals("c")) {
				System.out.println("Début du codage");
			} else {
				System.out.println("Début du décodage");
			}
			int caractere = br.read();
			int index = 0;
			while (caractere != -1) {
				char rslt; 				// Caractère que l'on va écrire dans le fichier out
				int rsltInt; 			// Entier correspondant
				
				// Codage du caractère
				if (caractere != 32 && caractere != 10) {					// 32 : espace ; 10 : saut de ligne
					caractere = caractere - 97; 							// On translate de -97 pour tomber dans la plage [0,25]
					char caractereCle = cle.charAt(index%longueurCle); 		// Caractère de la clé correspondante
					int caractereCleInt = Character.getNumericValue(caractereCle)-10;	// Entier clé correspondant
					if (op.equals("c")) { 	// Chiffrage
						rsltInt = (caractere + caractereCleInt) % 26;
					} else {			// Déchiffrage
						rsltInt = (caractere - caractereCleInt + 26) % 26;
					}
					// System.out.println(index + " : " + caractere + " x " + caractereCleInt + " -> " + rsltInt);
					rslt = alphabet.charAt(rsltInt);						// Obtention du caractère codé
					index++;
				} else {
					// System.out.println(index + " : " + caractere);
					rslt = (char) caractere;
				}
				
				// Ecriture dans le fichier out
				fw.write((char) rslt); 										// Cast en cas de 32 ou 10
								
				caractere = br.read();
			}
			if (op.equals("c")) {
				System.out.println("Fin du codage");
			} else {
				System.out.println("Fin du décodage");
			}
			
			// Fermeture des fichiers
			System.out.println("Fermeture des fichiers");
			fw.close();
			fr.close();
			System.out.println("Fichiers fermés");
		}
		catch (FileNotFoundException e) {
			System.out.println("Fichier non trouvé");
		}
		catch (IOException e) {
			System.out.println("Erreur lors de l'ouverture du fichier");
		}
	}
	
}
